#ifndef TYPES_HPP
#define TYPES_HPP

#include "typeAliases.hpp"
#include <variant>

namespace hms
{
	/*forward declaration of classes, for parameters, return types and friends*/
	template<typename MeshType>
	class MeshBase;
	template<typename EdgeType>
	class EdgeBase;
	template<typename EdgesType>
	class EdgesBase;
	template<typename CellType>
	class CellBase;
	template<typename EdgesType>
	class CellsBase;
	
	template<typename MeshType>
	class StructMeshBase;
	template<typename EdgeType>
	class StructEdgeBase;
	template<typename EdgesType>
	class StructEdgesBase;
	template<typename CellType>
	class StructCellBase;
	template<typename CellsType>
	class StructCellsBase;

	class UniMesh;
	class UniEdge;
	class UniEdges;
	class UniCell;
	class UniCells;

	class RectMesh;
	class RectEdge;
	class RectEdges;
	class RectCell;
	class RectCells;

	class StructMesh;
	class StructEdge;
	class StructEdges;
	class StructCell;
	class StructCells;

	class Mesh;
	class Edge;
	class Edges;
	class Cell;
	class Cells;

	class BoundaryPatch;

	enum class WhichCells;
	enum class EdgeRange;
	enum class BoundaryLocation;

	/* as return type of file import and optimisation operations, when the
	 * mesh type is not known in advance */
	using MeshVariant = std::variant<UniMesh,RectMesh,StructMesh,Mesh>;
}

#endif
